package cn.wen.java.text;

import java.util.Date;

import cn.wen.java.lang.HelperOfNumber;
import cn.wen.java.utils.Assert;
import cn.wen.java.utils.HelperOfDate;

/**
 * Title：格式化类
 * <p>
 * Description：
 * <p>
 * Copyright：Copyright (c) 2010-2012
 * 
 * @author <a href="mailto:ct_wen@qq.com">ctwen</a>, 温承瑭
 * @version Revision：1.0 Date：2011/9/7 Description：初完成。
 *          <p>
 *          Revision：1.1 Date：2012/7/18 Description：新增format(Object vo, String pattern)，智能判断值类型，由程序决定使用何种格式器（数值、日期）。
 *          <p>
 */
public class Formatter {

    /**
     * @param vo 数值对象
     * @param pattern 格式化串（非空）
     * @return 格式化后的数值字符串
     * @see #format(Object, String)
     */
    public static String number(Object vo, String pattern) {
	return format(vo, Flags.NUMBER, pattern);
    }

    /**
     * @param vo 日期对象
     * @param pattern 格式化串（非空）
     * @return 格式化后的日期字符串
     * @see #format(Object, String)
     */
    public static String date(Object vo, String pattern) {
	return format(vo, Flags.DATE, pattern);
    }

    /**
     * <pre>
     * 将传入的值格式化后返回结果。
     * 注：仅支持格式化Number（数值），Date（日期）。
     * <pre>
     * 
     * @param vo 值对象
     * @param pattern 格式化串（非空）
     * @return 格式化后的值
     */
    public static String format(Object vo, String pattern) throws IllegalArgumentException {
	if (vo instanceof Number) return number(vo, pattern);
	if (vo instanceof Date) return date(vo, pattern);
	throw new IllegalArgumentException("传入的值类型不正确！仅支持格式化Number（数值），Date（日期）。");
    }

    /**
     * <pre>
     * 根据type断言数据类型，使用指定格式化串，并返回格式化后的值。
     * 注：目前支持的类型(type)有：Formatter.Flags.DATE，Formatter.Flags.NUMBER。
     * 
     * <pre>
     * 
     * @param vo 值对象
     * @param type 数据类型（非空）
     * @param pattern 格式化串（非空）
     * @return 格式化后的值
     * @see #format(Object, String)
     */
    public static String format(Object vo, String type, String pattern) {
	Assert.isNotNull(type, "the type argument must be not null");
	Assert.isNotNull(pattern, "the pattern argument must be not null");

	if (Flags.NUMBER.equals(type)) {
	    return HelperOfNumber.format((Number) vo, pattern);
	}
	else if (Flags.DATE.equals(type)) {
	    return HelperOfDate.format((Date) vo, pattern);
	}
	else {
	    throw new IllegalArgumentException(type + "， 是不支持的类型，请换用\"date\"，\"number\"。");
	}
    }

    public static class Flags {

	/**
	 * Date flag the type of.
	 */
	public static final String DATE = "date";

	/**
	 * Number flag the type of.
	 */
	public static final String NUMBER = "number";

    }

}
